]> dgit.raspbian.org Git - gnome-shell.git/commit
global: Don't trust persistent/runtime state data
authorWill Thompson <wjt@endlessm.com>
Wed, 28 Aug 2019 14:39:44 +0000 (15:39 +0100)
committerFlorian Müllner <florian.muellner@gmail.com>
Tue, 3 Sep 2019 01:00:50 +0000 (01:00 +0000)
commita207f67f73ea7790f9562b46843c5f83f72973de
treebbba37ac7b1851fa1f2100c898ef4212cb5921ff
parentb73aace4767c52454dabf25cd624f9abd2da6bff
global: Don't trust persistent/runtime state data

An Endless OS system was found in the wild with a malformed
.local/share/gnome-shell/notifications. When deserialized in Python,
after passing trusted=True to g_variant_new_from_bytes(), the first
element of the first struct in the array looks like this:

    In [41]: _38.get_child_value(0).get_child_value(0)
    Out[41]: GLib.Variant('s', '\Uffffffff\Uffffffff\Uffffffff\Uffffffff\Uffffffff')

When deserialised in GJS, we get:

    gjs> v.get_child_value(0).get_child_value(0)
    [object variant of type "s"]
    gjs> v.get_child_value(0).get_child_value(0).get_string()
    typein:43:1 malformed UTF-8 character sequence at offset 0
      @typein:43:1
      @<stdin>:1:34

While g_variant_new_from_bytes() doesn't have much to say about its
'trusted' parameter, g_variant_new_from_data() does:

> If data is trusted to be serialised data in normal form then trusted
> should be TRUE. This applies to serialised data created within this
> process or read from a trusted location on the disk (such as a file
> installed in /usr/lib alongside your application). You should set
> trusted to FALSE if data is read from the network, a file in the
> user's home directory, etc.

Persistent state is read from the user's home directory, so it should
not be trusted. With trusted=False, the string value above comes out as
"".

I don't have an explanation for how this file ended up being malformed.
I also don't have an explanation for when this started crashing: my
guess is that recent GJS became stricter about validating UTF-8 but I
could be wrong!

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1552
src/shell-global.c